package com.jh.fcsm.util.io;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.net.URL;

/**
 * 上传文件
 * 创建人：szx
 * 创建时间：2014年12月23日
 */
public class FileUpload {
    public static final Logger logger = LoggerFactory.getLogger(FileUpload.class);

    private FileUpload() {

    }

    /**
     * 上传文件
     *
     * @param file     //文件对象
     * @param filePath //上传路径
     * @param fileName //文件名
     * @return 文件名
     */
    public static String fileUp(MultipartFile file, String filePath, String fileName) {
        String extName = ""; // 扩展名格式：
        try {
            if (file.getOriginalFilename().lastIndexOf('.') >= 0) {
                extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.'));
            }
            copyFile(file.getInputStream(), filePath, fileName + extName);
        } catch (IOException e) {
            logger.error("上传文件 异常", e);
        }
        return fileName + extName;
    }

    /**
     * 写文件到当前目录的upload目录中
     *
     * @param in
     * @param fileName
     * @throws IOException
     */
    public static String copyFile(InputStream in, String dir, String realName)
            throws IOException {
        File file = mkdirsmy(dir, realName);
        FileUtils.copyInputStreamToFile(in, file);
        in.close();
        return realName;
    }

    /**
     * 判断路径是否存在，否：创建此路径
     *
     * @param dir      文件路径
     * @param realName 文件名
     * @throws IOException
     */
    public static File mkdirsmy(String dir, String realName)  {
        File file = new File(dir, realName);
        if (file.exists()) {
            return file;
        }
        File parentDir = file.getParentFile();
        if (!parentDir.exists() && !parentDir.mkdirs()) {
            logger.error("创建文件夹失败");
        }
        try {
            if(file.createNewFile()){
                logger.info("创建文件成功");
            }
        } catch (IOException e) {
            logger.error("创建文件失败", e);
        }
        return file;
    }

    /**
     * 下载网络图片上传到服务器上
     *
     * @param httpUrl    图片网络地址
     * @param filePath   图片保存路径
     * @param myFileName 图片文件名(null时用网络图片原名)
     * @return 返回图片名称
     */
    public static String getHtmlPicture(String httpUrl, String filePath, String myFileName) {

        URL url;                        //定义URL对象url
        BufferedInputStream in = null;            //定义输入字节缓冲流对象in
        FileOutputStream file = null;            //定义文件输出流对象file
        try {
            String fileName = null == myFileName ? httpUrl.substring(httpUrl.lastIndexOf("/")).replace("/", "") : myFileName; //图片文件名(null时用网络图片原名)
            url = new URL(httpUrl);        //初始化url对象
            in = new BufferedInputStream(url.openStream());                                    //初始化in对象，也就是获得url字节流
            //file = new FileOutputStream(new File(filePath +"\\"+ fileName));
            file = new FileOutputStream(mkdirsmy(filePath, fileName));
            int t;
            while ((t = in.read()) != -1) {
                file.write(t);
            }

            return fileName;
        } catch (Exception e) {
            logger.error("下载网络图片上传到服务器上--异常", e);
        } finally {
            try {
                if (file != null) {
                    file.close();
                }
            } catch (IOException e) {
                logger.error("下载网络图片上传到服务器上--关闭file流异常", e);
            }

            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
                logger.error("下载网络图片上传到服务器上--关闭input流异常", e);
            }
        }
        return null;

    }
}
